# -*- coding: utf-8 -*-
"""
@Time    : 2024/7/10 14:18 
@Author  : ZhangShenao 
@File    : 1.使用configurable_fields方法动态设置参数.py 
@Desc    : 使用configurable_fields方法动态设置参数

通过设置configurable_fields,可以让Chain在实际执行调用时,在特定的步骤,为Chain动态设置运行时参数
可以在运行时动态调整temperature、stop、传递自定义参数等,甚至可以在运行时动态替换LLM模型

configurable_fields()和bind()非常接近,但是configurable_fields()的可配置范围更广
Runnable组件下有的所有属性,都可以通过configurable_fields()进行配置
而bind()只能配置组件所支持的调用参数

"""
import dotenv
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import ConfigurableField

dotenv.load_dotenv()
prompt = ChatPromptTemplate.from_template('请帮我随机生成一个{x}以内的正整数')
# 使用configurable_fields方法,定义可配置字段
llm = ChatZhipuAI(model='glm-4-air').configurable_fields(
    # 定义可配置字段
    temperature=ConfigurableField(
        id='llm_temperature',
        name='LLM的温度',
        description='该参数的值越大，表明LLM生成结果的随机性越强，越富有创造力',
    ))
parser = StrOutputParser()

# 使用with_config包装函数,生成一个新的可动态配置的Chain
# 通过configurable参数,为动态字段赋值
chain = (prompt | llm | parser).with_config(configurable={'llm_temperature': 1.0})
content = chain.invoke({'x': 1000})
print(content)

chain = (prompt | llm | parser).with_config(configurable={'llm_temperature': 0.1})
content = chain.invoke({'x': 1000})
print(content)
